iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
自我挑戰組

老菜雞挑戰30天學爆Unity&C#會成功嗎?...系列 第 5

【Day5】老菜雞學下樓梯遊戲之判斷碰撞/經過物件&標籤Tag

  • 分享至 

  • xImage
  •  

前言

昨天學到讓物件變成一個實體的樣子,並學會了物體與物體的碰撞,接著要繼續學如何用程式碼去判斷物件。


程式判斷碰撞物件- OnCollisionEnter2D

想要讓程式去判斷物件有沒有碰撞到其他物件,可以用Unity的內建方法— OnCollisionEnter2D,這個方法跟Update方法一樣,都會一直被重複執行

Void OnCollisionEnter2D(Collision2D other)  //other是指碰撞到的東西 

{ 

  Debug.Log("撞到"); //當Player碰撞到物件時會輸出"撞到"

} 

用tag去判斷撞到哪個物件

  • 如果想要更進階的判斷Player是撞到哪個物件,可以在物件上加上標籤(tag)
  • 當選取物件時,可以在右邊Inspector欄位看到Tag,且預設是沒有tag的(Untagged)。
    https://ithelp.ithome.com.tw/upload/images/20220916/2015241124zF7lZIC7.jpg
  • 如何新增tag?點選Add Tag→在List is Empty的下方按+號新增→輸入tag名稱→點Save
    https://ithelp.ithome.com.tw/upload/images/20220916/20152411siIfay2iXp.jpg

https://ithelp.ithome.com.tw/upload/images/20220916/20152411pBBwGL0Mv9.jpg
我新增了叫作Floor1的標籤及叫作Floor2的標籤。
https://ithelp.ithome.com.tw/upload/images/20220916/20152411UTbbDnFVQr.jpg
接著再點取Floor1這個物件→選取它的標籤。
https://ithelp.ithome.com.tw/upload/images/20220916/20152411dsRRIENMf5.jpg
Floor2的標籤設定方式也同上。

最後可以看到Floor1&Floor2各有各自的tag。
https://ithelp.ithome.com.tw/upload/images/20220916/20152411MPMFp4IT2G.jpg
https://ithelp.ithome.com.tw/upload/images/20220916/20152411XBhQx6ubBH.jpg
如此可以去修改剛剛的程式碼讓程式可以判斷Player撞到哪個物件。

void OnCollisionEnter2D(Collision2D other)  //other是指碰撞到的東西 
{ 
    if(other.gameObject.tag == "Floor1") 
    {
        Debug.Log("撞到 Floor1"); 
    }	 
    
    else if(other.gameObject.tag == "Floor2") 
    { 
        Debug.Log("撞到 Floor2"); 
    } 

} 


可以看到下方Console欄有輸出方塊撞到了Floor1或2。

程式判斷經過物件- OnTriggerEnter2D

https://ithelp.ithome.com.tw/upload/images/20220917/201524110L6AcVHve1.jpg
因為這個遊戲如果Player掉下去Game畫面外就算遊戲結束,所以目前有多增加一個叫Deathline的物件,但我們只是想要知道它有沒有掉下去超過這條死亡線而已,並沒有要它站在DeathLine上,所以可以在DeathLine的Box Collider 2D(Inspect那欄)勾選Is Trigger的選取框。
https://ithelp.ithome.com.tw/upload/images/20220917/201524119kB9vDkeKg.jpg
勾選後就可以看到Player掉下去了。

那還需要再加個可以讓程式判斷有經過物件的方法—OnTriggerEnter2D

void OnTriggerEnter2D(Collision2D other)   

{ 

if(other.gameObject.tag == "DeathLine") 

{ 

Debug.Log("你輸了!"); 

}	 

  } 


可以看到Player能經過DeathLine且不會停留在上面,Console欄也會輸出訊息。

目前做到這邊的程式碼長這樣↓

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    [SerializeField] float speed = 5f;
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        if(Input.GetKey(KeyCode.D)) {
            transform.Translate(speed*Time.deltaTime,0,0);
        }
        else if(Input.GetKey(KeyCode.A)) {
            transform.Translate(-speed*Time.deltaTime,0,0);
        }
    }

     void OnCollisionEnter2D(Collision2D other)  //other是指碰撞到的東西 
    { 
    if(other.gameObject.tag == "Floor1") 
    {
        Debug.Log("撞到Floor1"); 
    }	 
    else if(other.gameObject.tag == "Floor2") 

    { 
        Debug.Log("撞到Floor2"); 
    } 
    

    }

     void OnTriggerEnter2D(Collider2D other) {
        if(other.gameObject.tag == "DeathLine") 
    {
        Debug.Log("你輸了!"); 
    }
    }

 }


心得

今天學到的是昨天的延伸,所需的功能可以很輕易地透過內建function來達成,而因為Unity的內建function很完善,讓我們只要輸入它指定的function就可以達到想要的效果,不需要自己另外想個演算法真方便~~

參考網址:https://www.youtube.com/watch?v=nPW6tKeapsM&ab_channel=GrandmaCan-%E6%88%91%E9%98%BF%E5%AC%A4%E9%83%BD%E6%9C%83


上一篇
【Day4】老菜雞學到物件下樓梯效果之Unity&C#取得使用者輸入去控制物件 &剛體物件、碰撞判斷 (Rigidbody、Collider)
下一篇
【Day6】老菜雞學下樓梯遊戲之終於有雛型啦!(Unity匯入圖片及更改圖片大小)
系列文
老菜雞挑戰30天學爆Unity&C#會成功嗎?...30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言